home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 February: Tool Chest / Apple Developer CD Series Tool Chest February 1996 (Apple Computer)(1996).iso / Sample Code / Snippets / Sound / 2BufRecordBufferCmd / 2BufRecordBufferCmd.c next >
Encoding:
C/C++ Source or Header  |  1995-02-11  |  4.2 KB  |  192 lines  |  [TEXT/MPS ]

  1. #include    <Quickdraw.h>
  2. #include    <Windows.h>
  3. #include    <dialogs.h>
  4. #include    <OSEvents.h>
  5. #include    <Memory.h>
  6. #include    <Packages.h>
  7. #include    <Sound.h>
  8. #include    <SoundInput.h>
  9. #include    <OSUtils.h>
  10.  
  11. #define    TRUE            0xFF
  12. #define    FALSE            0
  13. #define buffSize        0x10000
  14.  
  15. typedef struct {
  16.     short        OnOff;
  17.     short         Level;
  18. } Level;
  19.  
  20.  
  21. pascal void MyRecComp (SPBPtr inParamPtr);
  22.  
  23. main()
  24. {
  25.     OSErr                err;
  26.     SPBPtr                RecordRec;
  27.     long                SoundRefNum;
  28.     Handle                Buffer, Buffer2;
  29.     SndChannelPtr        chan;
  30.     Level                myLevel;
  31.     short                headerlength, headerlength2, dummy;
  32.     Fixed                sampleRate;
  33.     SndCommand            mycmd;
  34.     SICompletionUPP     mySICompletionUPP;
  35.     
  36.     err = SPBOpenDevice (nil, siWritePermission, &SoundRefNum);
  37.     if (err != noErr)
  38.         Debugger();
  39.         
  40.     myLevel.OnOff = 0;
  41.     myLevel.Level = 0;
  42.     err = SPBSetDeviceInfo (SoundRefNum,siPlayThruOnOff, (Ptr) &myLevel);
  43.     if (err != noErr)
  44.         Debugger();
  45.         
  46.     myLevel.OnOff = 0;
  47.     myLevel.Level = 0;
  48.     err = SPBSetDeviceInfo (SoundRefNum,siTwosComplementOnOff, (Ptr) &myLevel);
  49.     if (err != noErr)
  50.         Debugger();
  51.         
  52.     err = SPBGetDeviceInfo (SoundRefNum,siSampleRate, (Ptr) &sampleRate);
  53.     if (err != noErr)
  54.         Debugger();
  55.         
  56.     RecordRec = (SPBPtr) NewPtr(sizeof (SPB));
  57.     if (MemError() != noErr || RecordRec == nil)
  58.         Debugger();
  59.  
  60.     Buffer = NewHandle(buffSize);
  61.     if (MemError() != noErr || Buffer == nil)
  62.         Debugger();
  63.     HLock (Buffer);
  64.  
  65.     err = SetupSndHeader (Buffer, 1, sampleRate, 8, 'NONE', 0x3C, 0, &headerlength);
  66.     if (err != noErr)
  67.         Debugger();
  68.     err = SetupSndHeader (Buffer, 1, sampleRate, 8, 'NONE', 0x3C, buffSize - headerlength, &dummy);
  69.     if (err != noErr)
  70.         Debugger();
  71.  
  72.     Buffer2 = NewHandle(buffSize);
  73.     if (MemError() != noErr || Buffer2 == nil)
  74.         Debugger();
  75.     HLock (Buffer2);
  76.  
  77.     err = SetupSndHeader (Buffer2, 1, sampleRate, 8, 'NONE', 0x3C, 0, &headerlength2);
  78.     if (err != noErr)
  79.         Debugger();
  80.         
  81.     err = SetupSndHeader (Buffer2, 1, sampleRate, 8, 'NONE', 0x3C, buffSize - headerlength2, &dummy);
  82.     if (err != noErr)
  83.         Debugger();
  84.         
  85.     /* create a SICompletionUPP */
  86.     mySICompletionUPP = NewSICompletionProc(MyRecComp);
  87.  
  88.     RecordRec->inRefNum = SoundRefNum;
  89.     RecordRec->count = 0;
  90.     RecordRec->milliseconds = 15000;
  91.     RecordRec->bufferLength = buffSize - headerlength;
  92.     RecordRec->bufferPtr = (Ptr) ((*Buffer) + headerlength);
  93.     RecordRec->completionRoutine = mySICompletionUPP;
  94.     RecordRec->interruptRoutine = nil;
  95.     RecordRec->userLong = 0;
  96.     RecordRec->error = 0;
  97.     RecordRec->unused1 = 0;
  98.  
  99.     chan = nil;
  100.     err = SndNewChannel (&chan, sampledSynth, 0, nil);
  101.     if (err != noErr)
  102.         Debugger();
  103.         
  104.     do {
  105.         err = SPBRecord (RecordRec, TRUE);
  106.         if (err != noErr)
  107.             Debugger();
  108.             
  109.         do {
  110.             } while (RecordRec->userLong == 0);
  111.         
  112.         if (RecordRec->userLong == 10) {
  113.             if (RecordRec->bufferPtr == (Ptr) ((*Buffer) + headerlength)) {
  114.                 RecordRec->bufferPtr = (Ptr) ((*Buffer2) + headerlength2);
  115.     
  116.                 mycmd.cmd = quietCmd;
  117.                 mycmd.param1 = 0;
  118.                 mycmd.param2 = 0;
  119.     
  120.                 err = SndDoCommand (chan, &mycmd, FALSE);
  121.                 if (err != noErr)
  122.                     Debugger();
  123.  
  124.                 mycmd.cmd = bufferCmd;
  125.                 mycmd.param1 = 0;
  126.                 mycmd.param2 = (long) ((*Buffer) + 20 /*headerlength2*/);
  127.     
  128.                 err = SndDoCommand (chan, &mycmd, FALSE);
  129.                 if (err != noErr)
  130.                     Debugger();
  131.  
  132.                 }
  133.             else {
  134.                 RecordRec->bufferPtr = (Ptr) ((*Buffer) + headerlength);
  135.     
  136.                 mycmd.cmd = quietCmd;
  137.                 mycmd.param1 = 0;
  138.                 mycmd.param2 = 0;
  139.     
  140.                 err = SndDoCommand (chan, &mycmd, FALSE);
  141.                 if (err != noErr)
  142.                     Debugger();
  143.     
  144.                 mycmd.cmd = bufferCmd;
  145.                 mycmd.param1 = 0;
  146.                 mycmd.param2 = (long) ((*Buffer2) + 20 /*headerlength2*/);
  147.     
  148.                 err = SndDoCommand (chan, &mycmd, FALSE);
  149.                 if (err != noErr)
  150.                     Debugger();
  151.  
  152.                 }
  153.             RecordRec->userLong = 0;
  154.             } 
  155.         } while (RecordRec->userLong != 1);
  156.         
  157.     mycmd.cmd = quietCmd;
  158.     mycmd.param1 = 0;
  159.     mycmd.param2 = 0;
  160.     
  161.     err = SndDoImmediate (chan, &mycmd);
  162.     if (err != noErr)
  163.         Debugger();
  164.  
  165.     err = SndDisposeChannel (chan,FALSE);
  166.     if (err != noErr)
  167.         Debugger();
  168.  
  169.     SPBCloseDevice (SoundRefNum);
  170.         
  171.     HUnlock (Buffer);
  172.     HUnlock (Buffer2);
  173.     DisposeHandle (Buffer);
  174.     DisposeHandle (Buffer2);
  175.     DisposePtr ((Ptr) RecordRec);
  176.     
  177.     DisposeRoutineDescriptor(mySICompletionUPP);
  178. }
  179. /**********************************/
  180.  
  181. pascal void MyRecComp (SPBPtr inParamPtr)
  182. {
  183.     inParamPtr->userLong = 10;    
  184.     
  185.     if (Button())
  186.         inParamPtr->userLong = 1;    
  187.     
  188.     return;
  189. }
  190.  
  191. /**********************************/
  192.